package com.lcy.algorithm.huawei;

import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
import java.util.Set;

/**
 * 题目描述:将一个csv格式的数据文件中包含有单元格引用的内容替换为对应单元格内容的实际值。
 * comma separated values(CSV)逗号分隔值，csv格式的数据文件使用逗号“" 作为分隔符将各单元的内容进行分隔。
 * 输入描述:1、输入只有一行数据 ,用逗号分隔每个单元格,行尾没有逗号。最多26个单元格,对应编号A~Z。
 * 2、每个单元格的内容包含字母和数字,以及使用'<>'分隔的单元格引用,例如: <A>表示引用第一个单元的值。
 * 3、每个单元格的内容,在替换前和替换后均不超过100个字符。
 * 5、引用单元格的位置不受限制,允许排在后面的单元格被排在前面的单元格引用。
 * 6、不存在循环引用的情况,比如下面这种场景是不存在的:
 * A单元格: aCd<B>8u
 * B单元格: kAy<A>dzqo
 * 7、不存在多重'<>的情况,一个单元格只能引用一个其他单元格。比如下面这种场景是不存在的:
 * A单元格: aCd8u
 * B单元格: kAydzqo
 * C单元格:y<<A><B>>d
 * 输出描述:输出所有单元格展开后的内容,单元格之间用","分隔。处理过程中出现错误时, 输出字符串“-1”表示出错。
 * 补充说明:
 * 示例1
 * 输入: 1,2<A>00
 * 输出: 1,2100
 * 说明:第二个单元中有对A单元的引用, A单元格的值为1 ,替换时,将A单元的内容替代<A>的位置,并和其他内容合并。
 * 示例2
 * 输入: 1<B>2,1
 * 输出: 112,1
 * 说明:第一个单元中有对B单元的引用，B单元格的值为1，替换时,将第二个数据单元的内容替代<B>的位置,并和其他内容合并。
 * 示例3
 * 输入:
 * 输出:-1
 * 说明:第一个单元中有错误的单元格引用方式,输出字符串"-1” 表示错误。
 */
public class 数据单元的变量替换 {
    //构建A—Z对应格子的规则
    private static final Map<String,Integer> map = new HashMap<>(26);
    static {
        for(int i = 0; i < 26; i ++){
            map.put("<" + (char)('A'+i) + ">",i);
        }
    }

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String input = scanner.nextLine();
        //校验输入是否为空
        if(input == null || input.equals("")){
            System.out.println(-1);
            return;
        }
        // 使用逗号分隔符将输入的数据拆分成单元格数组
        String[] cells = input.split(",");
        //校验单元格是否超过26格
        if(cells.length>26){
            System.out.println(-1);
            return;
        }

        // 替换引用单元格内容
        for (int i = 0; i < cells.length; i++) {
            //递归调用有可能会将数组大部分引用替换成具体值
            try{
                replaceCeil(cells,i);
            }catch (RuntimeException e){
                System.out.println("-1");
                return;
            }
        }

        // 输出替换后的单元格内容
        for (int i = 0; i < cells.length; i++) {
            if(i < cells.length - 1){
                System.out.print(cells[i]+",");
            }else{
                System.out.println(cells[i]);
            }
        }
    }

    //递归替换引用
    private static String replaceCeil(String[] cells, int index){
        StringBuilder sb = new StringBuilder(cells[index]);
        if(cells[index].contains("<")){
            int start = cells[index].indexOf("<");
            String substring = (cells[index].substring(start, start + 3));
            if(map.containsKey(substring)){
                String s = replaceCeil(cells, map.get(substring));
                sb.replace(start, start + 3, s);
                cells[index] = sb.toString();
            }
        }

        //如果替换过一次以后,还有<X>则报错
        if(cells[index].contains("<")){
            int start = cells[index].indexOf("<");
            String substring = (cells[index].substring(start, start + 3));
            if(map.containsKey(substring)){
                throw new RuntimeException();
            }
        }
        return cells[index];
    }

}
